/**
 * 
 */
package com.ms.game.itembox;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

import com.ms.player.Player;
import com.xpec.c4.db.model.log.basic.BasicLogModel;
import com.xpec.c4.game.utility.GameUtility;
import com.xpec.c4.service.module.common.ItemInfoManager;

/**
 * 處理遊戲中獲得道具的相關參數
 * 
 * @author TW15010
 */
public class GameDropItemParam implements Serializable {
	private static final long serialVersionUID = 6772021421255261086L;

	/**
	 * 是否是使用道具進行遊戲
	 * 如果不是就是掉落道具
	 */
	private boolean useItemInGame = false;
	
	
	public boolean isUseItemInGame() {
		return useItemInGame;
	}

	public void setUseItem(boolean useItemInGame) {
		this.useItemInGame = useItemInGame;
	}

	/**
	 * 要獲得的道具清單<br>
	 * key: item id<br>
	 * value: drop item info
	 */
	private HashMap<String, GameDropItemInfo> dropItemMap = new HashMap<String, GameDropItemInfo>();

	/**
	 * 要獲得的水晶數量
	 */
	private int dropCrystal;

	// 回傳資料 =========================================

	/**
	 * 有更新的道具清單<br>
	 * key: item sn<br>
	 * value: item count
	 */
	private HashMap<String, Integer> updateItemMap = new HashMap<String, Integer>();

	/**
	 * 新增的道具清單<br>
	 * key: item sn<br>
	 * value: item info
	 */
	private HashMap<String, Item> newItemMap = new HashMap<String, Item>();

	/**
	 * 更動後的水晶數量
	 */
	private int updateCrystal;

	/**
	 * 異動過程中的 log 資料
	 */
	private ArrayList<BasicLogModel> logList = new ArrayList<BasicLogModel>();

	/**
	 * 是否有獲得道具
	 * 
	 * @return
	 */
	public boolean isHaveItem() {
		if (dropItemMap.size() > 0) {
			return true;
		}

		return false;
	}

	/**
	 * 是否有獲得水晶
	 * 
	 * @return
	 */
	public boolean isHaveCrystal() {
		if (dropCrystal > 0) {
			return true;
		}

		return false;
	}

	/**
	 * 是否有獲得任何東西, 不管獲得什麼都行
	 * 
	 * @return
	 */
	public boolean isHaveReward() {
		if (isHaveItem()) {
			return true;
		}

		if (isHaveCrystal()) {
			return true;
		}

		return false;
	}

	/**
	 * 加入一個要送的道具
	 * 
	 * @param itemId
	 *            道具 id
	 * @param itemCount
	 *            道具數量
	 * @param currentCount
	 *            目前數量
	 * @param player
	 *            角色資料
	 */
	public void addItem(String itemId, int itemCount,String itemSn, Player player) {
		if (!GameUtility.isHaveString(itemId)) {
			return;
		}

		// 道具資料不存在於 bin 檔中
		if (!ItemInfoManager.getInstance().isItemExist(itemId)) {
			return;
		}

		if (itemCount <= 0) {
			return;
		}

		if (player == null) {
			return;
		}

		// 從列表中取出指定的道具資訊
		GameDropItemInfo info = dropItemMap.get(itemId);

		// 如果取不到就生一個放進去
		if (info == null) {
			info = new GameDropItemInfo();
			info.setId(itemId);
			info.setItemSn(itemSn);
			dropItemMap.put(itemId, info);
		}

		info.setCount(info.getCount() + itemCount);

		int currentCount = player.getItemBox().getItemCountById(itemId);
		info.setCurrentCount(currentCount);
	}

	public HashMap<String, GameDropItemInfo> getDropItemMap() {
		return dropItemMap;
	}

	public void setDropItemMap(HashMap<String, GameDropItemInfo> dropItemMap) {
		this.dropItemMap = dropItemMap;
	}

	public int getDropCrystal() {
		return dropCrystal;
	}

	/**
	 * 設定遊戲中掉落的水晶數量
	 * 
	 * @param dropCrystal
	 *            數量
	 */
	public void setDropCrystal(int dropCrystal) {
		if (dropCrystal < 0) {
			return;
		}

		this.dropCrystal = dropCrystal;
	}

	public int getUpdateCrystal() {
		return updateCrystal;
	}

	public void setUpdateCrystal(int updateCrystal) {
		this.updateCrystal = updateCrystal;
	}

	public HashMap<String, Integer> getUpdateItemMap() {
		return updateItemMap;
	}

	public void setUpdateItemMap(HashMap<String, Integer> updateItemMap) {
		this.updateItemMap = updateItemMap;
	}

	public HashMap<String, Item> getNewItemMap() {
		return newItemMap;
	}

	public void setNewItemMap(HashMap<String, Item> newItemMap) {
		this.newItemMap = newItemMap;
	}

	public ArrayList<BasicLogModel> getLogList() {
		return logList;
	}

	public void setLogList(ArrayList<BasicLogModel> logList) {
		this.logList = logList;
	}
}
